//package cn.springmix.common.sentinel.feign.handle;
//
//import com.alibaba.csp.sentinel.Tracer;
//import com.chhd.cloud.common.core.enums.HttpResponseEnum;
//import com.chhd.cloud.common.core.enums.WxErrprCodeEnum;
//import com.chhd.cloud.common.core.exception.RRException;
//import com.chhd.cloud.common.core.utils.R;
//import com.github.binarywang.wxpay.exception.WxPayException;
//import lombok.extern.slf4j.Slf4j;
//import me.chanjar.weixin.common.error.WxErrorException;
//import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
//import org.springframework.dao.DuplicateKeyException;
//import org.springframework.http.HttpStatus;
//import org.springframework.http.converter.HttpMessageNotReadableException;
//import org.springframework.security.access.AccessDeniedException;
//import org.springframework.security.core.SpringSecurityMessageSource;
//import org.springframework.validation.BindException;
//import org.springframework.validation.FieldError;
//import org.springframework.web.HttpRequestMethodNotSupportedException;
//import org.springframework.web.bind.MethodArgumentNotValidException;
//import org.springframework.web.bind.annotation.ExceptionHandler;
//import org.springframework.web.bind.annotation.ResponseStatus;
//import org.springframework.web.bind.annotation.RestController;
//import org.springframework.web.bind.annotation.RestControllerAdvice;
//import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
//
//import java.util.List;
//
///**
// * <p>
// * 全局异常处理器结合sentinel 全局异常处理器不能作用在 oauth server https://gitee.com/log4j/pig/issues/I1M2TJ
// * </p>
// *
// * @author
// * @date 2020-06-29
// */
//@Slf4j
//@RestController
//@RestControllerAdvice
//@ConditionalOnExpression("!'${security.oauth2.client.clientId}'.isEmpty()")
//public class GlobalBizExceptionHandler {
//
//    /**
//     * 全局异常.
//     *
//     * @param e the e
//     * @return R
//     */
//    @ExceptionHandler(Exception.class)
//    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
//    public R handleGlobalException(Exception e) {
//        log.error(String.format("全局异常:%s", e.getMessage()), e);
//        // 业务异常交由 sentinel 记录
//        Tracer.trace(e);
//        return R.error();
//    }
//
//    /**
//     * 处理自定义异常
//     * 业务异常,http状态码依然是200，但是code 是5000
//     */
//    @ExceptionHandler(RRException.class)
//    @ResponseStatus(HttpStatus.OK)
//    public R handleRRException(RRException e) {
//        log.error(String.format("业务异常:%s", e.getMsg()), e);
//        return R.error(e.getMessage());
//    }
//
//    /**
//     * @param e
//     * @return
//     */
//    @ExceptionHandler(DuplicateKeyException.class)
//    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
//    public R handleDuplicateKeyException(DuplicateKeyException e) {
//        log.error(String.format("数据库异常:%s", e.getMessage()), e);
//        return R.error("数据库中已存在该记录");
//    }
//
//    /**
//     * json序列化失败
//     *
//     * @param e
//     * @return
//     */
//    @ExceptionHandler(HttpMessageNotReadableException.class)
//    @ResponseStatus(HttpStatus.BAD_REQUEST)
//    public R handlePostException(HttpMessageNotReadableException e) {
//        log.error(String.format("JSON序列化失败异常:%s", e.getMessage()), e);
//        return R.error("JSON序列化失败.检查JSON参数");
//    }
//
//    /**
//     * 请求格式不匹配
//     *
//     * @param e
//     * @return
//     */
//    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
//    @ResponseStatus(HttpStatus.BAD_REQUEST)
//    public R handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) {
//        log.error(String.format("请求格式异常:%s", e.getMessage()), e);
//        return R.RBuild.builder(HttpResponseEnum.CLIENT_ERROR_CODE).msg(e.getMessage()).build();
//    }
//
//    /**
//     * AccessDeniedException
//     *
//     * @param e the e
//     * @return R
//     */
//    @ExceptionHandler(AccessDeniedException.class)
//    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
//    public R handleAccessDeniedException(AccessDeniedException e) {
//        String msg = SpringSecurityMessageSource.getAccessor().getMessage("AbstractAccessDecisionManager.accessDenied",
//                e.getMessage());
//        log.error(String.format("拒绝授权异常信息:%s", msg), e);
//        return R.error(e.getLocalizedMessage());
//    }
//
//    /**
//     * validation Exception
//     *
//     * @param exception
//     * @return R
//     */
//    @ResponseStatus(HttpStatus.BAD_REQUEST)
//    @ExceptionHandler({MethodArgumentNotValidException.class})
//    public R handleBodyValidException(MethodArgumentNotValidException exception) {
//        List<FieldError> fieldErrors = exception.getBindingResult().getFieldErrors();
//        log.error(String.format("参数绑定异常:%s", fieldErrors.get(0).getDefaultMessage()), exception.getMessage());
//        return R.error(fieldErrors.get(0).getDefaultMessage());
//    }
//
//    /**
//     * 非法参数验证异常
//     *
//     * @param e
//     * @return
//     */
//    @ExceptionHandler(MethodArgumentTypeMismatchException.class)
//    @ResponseStatus(value = HttpStatus.OK)
//    public R handleMethodArgumentTypeMismatchExceptionHandler(MethodArgumentTypeMismatchException e) {
//        log.error("方法:{},字段:{},参数:{},错误信息:{}", e.getParameter().getMethod(), e.getName(), e.getValue(),
//                e.getMessage());
//        return R.RBuild.builder(HttpResponseEnum.CLIENT_ERROR_CODE).msg(e.getMessage()).build();
//    }
//
//    /**
//     * validation Exception (以form-data形式传参)
//     *
//     * @param exception
//     * @return R
//     */
//    @ResponseStatus(HttpStatus.BAD_REQUEST)
//    @ExceptionHandler({BindException.class})
//    public R bindExceptionHandler(BindException exception) {
//        List<FieldError> fieldErrors = exception.getBindingResult().getFieldErrors();
//        log.error("参数绑定异常:{}", fieldErrors.get(0).getDefaultMessage());
//        return R.RBuild.builder(HttpResponseEnum.CLIENT_ERROR_CODE).msg(fieldErrors.get(0).getDefaultMessage()).build();
//    }
//
//    /**
//     * 微信的异常
//     *
//     * @param e
//     * @return
//     */
//    @ExceptionHandler(WxErrorException.class)
//    public R getWxErrorException(WxErrorException e) {
//        log.error(e.getMessage(), e);
//        String error = WxErrprCodeEnum.getDesc((long) e.getError().getErrorCode());
//        if (null == error) {
//            return R.error();
//        }
//        return R.error(error);
//    }
//
//    /**
//     * 微信支付的异常
//     *
//     * @param e
//     * @return
//     */
//    @ExceptionHandler(WxPayException.class)
//    public R getWxErrorException(WxPayException e) {
//        log.error(e.getMessage(), e);
//        return R.error(e.getCustomErrorMsg());
//    }
//
//}
